package main

import (
	"fmt"
	"os"
	"strconv"
	"sync"
	"time"
)

// 编写一个程序，模拟多个服务产生日志，使用goroutine并发地收集这些日志，并将其写入一个文件中。
// 要求：
// ● 使用多个goroutine模拟服务产生日志
// ● 使用channel传递日志信息
// ● 主goroutine将日志信息写入文件

func main() {
	strs := []string{"a", "b", "c", "d", "e", "f", "g", "h"}

	wg := sync.WaitGroup{}
	ch := make(chan string, 10)

	go func() {
		wg.Wait()
		close(ch)
	}()

	for _, str := range strs {
		wg.Add(1)
		go product(str, ch, &wg)
	}

	writeToFile(ch)
}

func writeToFile(ch chan string) {
	file, err := os.OpenFile("./log.txt", os.O_WRONLY, 0)
	if err != nil {
		fmt.Println("err:", err)
		return
	}
	defer file.Close()

	for s := range ch {
		_, err = file.WriteString(s + "\n")
		if err != nil {
			fmt.Println("err:", err)
			return
		}
	}
}

func product(str string, ch chan string, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 0; i < 10; i++ {
		time.Sleep(100 * time.Millisecond)
		ch <- fmt.Sprintf("the %s message from %s", strconv.Itoa(i), str)
	}
}
